有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

security Java安全地存储代码中使用所需的用户帐户详细信息

我正在构建一个与web服务交互的应用程序。为了使用该web服务,我必须使用我的实际用户名和密码登录-没有其他方法使用该服务

我不想硬编码我的细节,比如:

String username = "MyUsername";
String password = "MyPassword";

我曾考虑对细节进行加密并将其存储在文件中,但即便如此,任何有编程经验的人都可以通过查看我的源代码轻松恢复信息:

File f = load("mydetails.txt");
String[] = recoverDetails(f); //or something like that

存储此信息的最安全方式是什么


共 (6) 个答案

  1. # 1 楼答案

    既然你建议人们可以看到你的代码,我猜他们也可以在硬件上运行软件(这意味着他们有根,任何只读限制最终都会失败)

    我能想到的唯一安全的方法是:

    • 在智能卡上给自己一个电子签名
    • 使用公钥加密密码并存储它

    这样,使用您的凭据的唯一方法是使用私钥解密,私钥以只读方式存储在您的卡上,并使用附加密码(PIN码)访问

    正如Pointy所提到的,如果没有人为因素持有秘密(私钥的PIN码和智能卡的物理所有权),就没有办法使信息100%安全

  2. # 2 楼答案

    您没有提到代码部署在哪里。如果您的应用程序在客户的机器上运行并直接发出web服务请求,则无法阻止某人获取凭据。即使您对它们进行了加密,应用程序也必须能够使它们可用,因此解密密钥必须对其可用,从而对您的用户可用。即使您可以安全地加密它,用户也有其他方法,因为它是他们的盒子,例如嗅探出站网络流量

    如果进行web服务调用的代码在您的服务器上,那么您也有同样的问题,但至少可以控制环境。在某些情况下,服务器必须将加密的凭据呈现为可用的形式以发出web服务请求,因此您可以对web服务凭据进行加密,但密码或证书必须可供代码访问。除非每次都有人为证书输入密码,否则这只会嵌套凭据,但不会保护它们

    当然,解决这个问题的方法不是试图在代码中解决不安全的web服务需求问题。或者找到一个可以调用的更安全的等效web服务(可能是使用API密钥和用户自己的凭据或生成安全令牌的web服务),或者游说web服务提供商以正确的方式进行调用。看看Twitter和Facebook在安全方面的所有最新进展——用户需求可以带来不同

  3. # 3 楼答案

    如果你真的想让它们安全,你就必须把它们锁在一个加密安全的“保险库”文件中。有人——你或你信任的人,不管这在这里是否合适——会提供一把解锁保险库的钥匙(基本上是另一个密码),然后你的软件将能够访问其中存储的信息

    如果没有人在启动应用程序时涉及到秘密,那么就真的没有办法完全隐藏信息。这只是一个简单的现实事实,许多人(如DVD联盟)都竭力否认这一事实,但风险自负

  4. # 4 楼答案

    正如其他人所指出的,没有神奇的方法来隐藏你的密码(这在逻辑上是不可能的,c.f.DVD拷贝保护),但是你应该采取一些安全预防措施来最大限度地减少潜在的破坏

    如果您无法控制服务器(例如,您正在共享主机上运行应用程序),则:

    • 确保您登录的web服务帐户(使用MyUsername/MyPassword)仅具有此应用所需的最低权限
    • 仅将此帐户用于一个部署(这样,如果它被破坏,您可以锁定此帐户,而不会影响其他应用程序/安装)

    如果您确实控制了服务器,那么除了:

    • 保护服务器安全,即正常进行的系统管理任务,如防火墙、安装最新补丁、监视日志等
  5. # 5 楼答案

    您应该使用散列函数,数据库密码不应存储为明文,而应存储为散列值。然后,您只向数据库提供散列,因为其中还有一个散列,您不必担心任何事情

    但是,如果您必须在程序中使用明文,则带有调试器的攻击者可以在您向数据库提供用户名和密码时找到它们。更重要的是,如果您使用不安全的网络协议,外部攻击者可以使用嗅探工具(如wireshark)观察您的网络,并仅获取值。因此,不建议在程序运行期间使用任何明文用户名-密码对

    无论如何,如果必须这样做,最好和最安全的方法是加密用户名/密码对,当它们被发送到服务器时,您应该解密它们并以明文形式发送,因为服务器无法理解加密。但是,如果您可以访问服务器,也许您应该对其进行一些修改,使其不会以明文形式存储密码

    干杯

  6. # 6 楼答案

    将其存储在文件中,但使文件只读且仅可由服务进程读取

    如果您想泄露应用程序,则无法以无法恢复登录信息的方式对其进行保护。对不起

    通常,这是通过提供服务器端安全性和为公共API的每个用户提供他们自己的凭据来处理的。这就像谷歌地图一样,你必须获得一个特殊的密钥并使用它来使用API,因此谷歌可以跟踪你是否以合法的方式使用API